/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.assembler.output.p44;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.client.om.IClientEntreprise;
import fr.generali.accueilclient.client.om.impl.ClientEntreprise;

import fr.generali.refservcommuns.rce.demat.consultpersonneenvcomplet.dossierpersonneenvcomplet.DtoDossierP44;
import fr.generali.refservcommuns.clients.prima.DatedMonetaryQuantityRangeValue;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.detailspersonnes.DtoProcedureJudiciaire;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.detailspersonnes.DtoSuiviAnnuelEntreprise;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.detailspersonnes.DtoResultatFinancierFrance;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.personnes.DtoPersonneMorale;

/**
 * Transforme un {@link DtoDossierP44} en {@link IClientEntreprise}
 * 
 * @author selrhazala
 */
@Component("dtoDossierP44ToClientEntrepriseConverter")
public class DtoDossierP44ToClientEntrepriseConverter implements Converter<DtoDossierP44, IClientEntreprise> {

    /**
     * LOGGER
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(DtoDossierP44ToClientEntrepriseConverter.class);

    /**
     * {@inheritDoc}
     */
    public IClientEntreprise convert(DtoDossierP44 input) {
        LOGGER.debug("assemble");
        IClientEntreprise client = new ClientEntreprise();
        DtoPersonneMorale personneMorale = input.getPersonneMorale();

        client.setSigle(personneMorale.getSigle());

        if (personneMorale.getEntreprise() != null) {
            client.setSiren(personneMorale.getEntreprise().getCodeSIREN());
            client.setCodeNic(personneMorale.getEntreprise().getCodeNIC());
            client.setCaisseRetraite(personneMorale.getEntreprise().getCaisseRetraite());
        }
        client.setCodeApe(personneMorale.getCodeNAF());

        if (personneMorale.getDateCreation() != null) {
            client.setDateCreation(personneMorale.getDateCreation().toGregorianCalendar().getTime());
        }

        if (personneMorale.getDateEtablissement() != null) {
            client.setDateCreationEntreprise(personneMorale.getDateEtablissement().toGregorianCalendar().getTime());
        }

        if (CollectionUtils.isNotEmpty(personneMorale.getResultatFinancier())) {
            DtoResultatFinancierFrance resultatFinancier =
                            personneMorale.getResultatFinancier().get(personneMorale.getResultatFinancier().size() - 1);

            if (resultatFinancier.getChiffreAffaireBorne() != null) {
                client.setNiveauCA(resultatFinancier.getChiffreAffaireBorne().getCodeIndicateurSaisie());
            }
            if (resultatFinancier.getPeriodeConsideree() != null
                            && resultatFinancier.getPeriodeConsideree().getStartDate() != null
                            && resultatFinancier.getPeriodeConsideree().getStartDate().toString().length() > 3) {
                client.setAnneeExercice(resultatFinancier.getPeriodeConsideree().getStartDate().toString()
                                .substring(0, 4));
            }
        }

        if (personneMorale.getResultatFinancierAExport() != null
                        && !personneMorale.getResultatFinancierAExport().isEmpty()) {
            DatedMonetaryQuantityRangeValue chiffreAffaireBorneAExport =
                            personneMorale.getResultatFinancierAExport().get(0).getChiffreAffaireAExportBorne();
            if (chiffreAffaireBorneAExport != null) {
                client.setPartCAExport(chiffreAffaireBorneAExport.getCodeIndicateurSaisie());
            }
        }

        if (personneMorale.getCompteEspaceClient() != null && personneMorale.getCompteEspaceClient().length() > 0) {
            client.setCompteEspaceClient(personneMorale.getCompteEspaceClient());
        }

        if (CollectionUtils.isNotEmpty(personneMorale.getSuiviAnnuelEntreprise())) {
            DtoSuiviAnnuelEntreprise dtoSuiviAnnuelEntreprise =
                            personneMorale.getSuiviAnnuelEntreprise().get(
                                            personneMorale.getSuiviAnnuelEntreprise().size() - 1);

            client.setNbSalaries((dtoSuiviAnnuelEntreprise.getNombreEmployesBorne() == null) ? null
                            : dtoSuiviAnnuelEntreprise.getNombreEmployesBorne().getCodeIndicateurSaisie());

            client.setAnneeExercice((dtoSuiviAnnuelEntreprise.getExercice() == null) ? null : dtoSuiviAnnuelEntreprise
                            .getExercice().toString());

            client.setNbCadres((dtoSuiviAnnuelEntreprise.getNombreCadresBorne() == null) ? null
                            : dtoSuiviAnnuelEntreprise.getNombreCadresBorne().getCodeIndicateurSaisie());
        }

        if (personneMorale.getRelationClient() != null) {
            client.setTitreCourrier(StringUtils.trimToNull(personneMorale.getRelationClient().getTitreCourrier()));
        }

        if (personneMorale.getMoisClotureComptable() != null) {
            if (personneMorale.getMoisClotureComptable().toString().length() == 1) {
                client.setMoisClotureComptable("0" + personneMorale.getMoisClotureComptable());
            } else {
                client.setMoisClotureComptable(personneMorale.getMoisClotureComptable().toString());
            }
        }

        if (personneMorale.getSecteurActivite() != null) {
            client.setSecteurActivite(personneMorale.getSecteurActivite().getCode());
        }

        if (personneMorale.isVip() != null) {
            client.setClientVIP(personneMorale.isVip());
        }

        client.setOrigineClient(StringUtils.trimToNull(personneMorale.getRaisonConnaissanceTiers()));

        if (CollectionUtils.isNotEmpty(personneMorale.getProcedureJudiciaire())) {
            DtoProcedureJudiciaire dtoProcedureJudiciaire = personneMorale.getProcedureJudiciaire().get(0);
            client.setTypeProcedure((dtoProcedureJudiciaire.getTypeProcedureJudiciaire() == null) ? null
                            : dtoProcedureJudiciaire.getTypeProcedureJudiciaire().toString());
            client.setDateJugement((dtoProcedureJudiciaire.getDateJugement() == null) ? null : dtoProcedureJudiciaire
                            .getDateJugement().toGregorianCalendar().getTime());
        }

        return client;
    }
}
